import java.util.Arrays;

public class myArrayList<T> {
    private final int SIZE=16;
    private Object[] arr;
    private int size;
    private int count;

    //无参构造方法
    public myArrayList(){
        arr=new Object[SIZE];
    }

    //指定大小构造方法
    public myArrayList(int len){
        int count=1;
        while(count<len){
            count*=2;
        }
        arr=new Object[len];
    }

    //获取顺序表中当前元素的个数
    public int length(){
        return this.size;
    }

    //获取顺序表中索引为  i 处的元素，i表示索引，即以 0 开始
    public T get(int i){
        if(i<0||i>this.size-1){
            System.out.println("输入下标异常");
            return null;
        }
        return (T)arr[i];
    }

    //查看顺序表中指定元素的索引，若未找到，返回-1
    public int locate(T element){
        for(int i=0;i<this.size;i++){
            if(this.arr[i].equals(element)){
                return i;
            }
        }
        return -1;
    }

    //当数组容量已满时，对数组进行扩容。将容量扩展到大于minCapacity的最小2的次方
    private void ensureCapacity(int minCapacity){
        while(this.count<minCapacity){
            this.count*=2;
        }
        arr= Arrays.copyOf(arr,count);
    }



    //在顺序表的指定索引处插入一个元素
    public void insert(T element, int index){
        if(index<0||index>this.size){
            System.out.println("输入下标异常");
            return;
        }
        this.ensureCapacity(this.size+1);
        for(int i=this.size;i>index;i--){
            arr[i]=arr[i-1];
        }
        arr[index]=element;
        this.size++;
    }

    //在顺序表的末尾添加一个元素
    public void add(T element){
        this.insert(element,this.size);
    }

    //删除顺序表中指定索引处的元素
    public T delete(int index){
        if(index<0||index>this.size-1){
            System.out.println("输入下标异常");
            return null;
        }
        T t=(T)this.arr[index];
        for(int i=index;i<this.size;i++){
            arr[i]=arr[i+1];
        }
        this.size--;
        return t;
    }

    //删除顺序表中的最后一个元素
    public T remove(){
        return this.delete(this.size-1);
    }

    //判断顺序表是否为空表
    public boolean empty(){
        return this.size==0;
    }

    //清空顺序表
    public void clear(){
        for(int i=0;i<this.size;i++){
            arr[i]=null;
        }
        this.size=0;
    }

}

